home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / knowhow4 / axe.cpp < prev    next >
C/C++ Source or Header  |  1994-11-19  |  4KB  |  157 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "axe.h"
  4. #include <mem.h>
  5. #include <math.h>
  6.  
  7.  
  8. Axe::Axe(int l, double start, double end, int tick_no, int* t,
  9.      int s_tick_no, int* s, char** lab)
  10.     {
  11.     len_scr = l;
  12.     ticks = sub_ticks = NULL;
  13.     if(start != end)
  14.     {
  15.     labels = (char**)malloc(sizeof(char*) * MAXLABELS);
  16.     calc_labels(start, end, tick_no, s_tick_no);
  17.  
  18.     if(s_tick_no != 0)
  19.         {
  20.         if(sub_ticks == NULL)
  21.         sub_ticks = new int[s_tick_no + 2];
  22.         for(int i = 0; i < s_tick_no; i++)
  23.         sub_ticks[i] = s[i];
  24.         }
  25.     else
  26.         {
  27.         sub_ticks_no = ticks_no;
  28.         if(sub_ticks == NULL)
  29.         sub_ticks = new int[ticks_no + 2];
  30.         for(int i = 0; i < sub_ticks_no; i++)
  31.         sub_ticks[i] = ticks[i];
  32.         }
  33.     return;
  34.     }
  35.     sub_ticks_no = s_tick_no;
  36.     ticks_no = tick_no;
  37.     if(tick_no != 0)
  38.     {
  39.     ticks = new int[tick_no + 2];
  40.  
  41.     labels = (char**)malloc(sizeof(char*) * tick_no + 2);
  42.     for(int i = 0; i < tick_no; i++)
  43.         {
  44.         ticks[i] = t[i];
  45.         labels[i] = strdup(lab[i]);
  46.         }
  47.     }
  48.     if(s_tick_no != 0)
  49.     {
  50.     if(sub_ticks == NULL)
  51.         sub_ticks = new int[s_tick_no + 2];
  52.     for(int i = 0; i < s_tick_no; i++)
  53.         sub_ticks[i] = s[i];
  54.     }
  55.     }
  56. ///////////////////////////////////
  57. Axe::~Axe()
  58.     {
  59.     delete ticks;
  60.     delete sub_ticks;
  61.     for(int i = 0; i < ticks_no; i++)
  62.     delete labels[i];
  63.     delete labels;
  64.     }
  65. ///////////////////////////////////
  66. void Axe::draw_axe(loc lt, int ax_col, int lab_col)
  67.     {
  68.     show_axe(lt, ax_col);
  69.     drawTool->setcolor(lab_col);
  70.     show_labels(lt);
  71.     }
  72. //////////////////////////////////
  73. /*
  74. int Axe::calc_labels(double start, double end, int t, int s)
  75.     {
  76.     ticks_no = t;
  77.     ticks = new int[ticks_no];
  78.     char str[80];
  79.     for(int i = 0; i < ticks_no; i++)
  80.     {
  81.     sprintf(str, "%g", start + (end - start) / (ticks_no - 1) * i);
  82.     labels[i] = strdup(str);
  83.     ticks[i] = 10000 / (ticks_no - 1) * i;
  84.     }
  85.  
  86.     sub_ticks_no = s;
  87.     sub_ticks = new int[sub_ticks_no];
  88.     for(i = 0; i < sub_ticks_no; i++)
  89.     sub_ticks[i] = 10000 / (sub_ticks_no - 1) * i;
  90.     return ticks_no;
  91.     }
  92. */
  93. ///////////////////////////////
  94. int Axe::calc_labels(double start, double end, int /*t*/, int s)
  95.     {
  96.     double len = pow10((int)log10(end - start));
  97.     if((end - start) / len <= 3)
  98.     len /= 5;
  99.  
  100.     ticks_no = (end - start) / len + 1;
  101.     ticks = new int[ticks_no + 2];
  102.     char str[80];
  103.  
  104.     if(end > 0 && start >= 0)
  105.     {
  106.     int i;
  107.     double pos;
  108.     for(i = 0, pos = (int)(start / len + 1) * len;
  109.         pos <= end && i < ticks_no; i++, pos += len)
  110.         {
  111.         sprintf(str, "%g", pos);
  112.         labels[i] = strdup(str);
  113.         ticks[i] = 10000 / ((end - start) / (pos - start));
  114.         }
  115.     ticks_no = i;
  116.     }
  117.     else if(end <= 0 && start < 0)
  118.     {
  119.     int i;
  120.     double pos;
  121.     for(i = 0, pos = (int)(end / len - 1) * len;
  122.         pos >= start && i < ticks_no; i++, pos -= len)
  123.         {
  124.         sprintf(str, "%g", pos);
  125.         labels[i] = strdup(str);
  126.         ticks[i] = start == pos
  127.         ? 0 : 10000.0 / ((end - start) / (pos - start));
  128.         }
  129.     ticks_no = i;
  130.     }
  131.     else
  132.     {
  133.     int i;
  134.     double pos;
  135.     for(i = 0, pos = 0; pos <= end && i < ticks_no; i++, pos += len)
  136.         {
  137.         sprintf(str, "%g", pos);
  138.         labels[i] = strdup(str);
  139.         ticks[i] = 10000 / ((end - start) / (pos - start));
  140.         }
  141.     for(pos = -len; pos >= start && i < ticks_no; i++, pos -= len)
  142.         {
  143.         sprintf(str, "%g", pos);
  144.         labels[i] = strdup(str);
  145.         ticks[i] = start == pos
  146.         ? 0 : 10000.0 / ((end - start) / (pos - start));
  147.         }
  148.     ticks_no = i;
  149.     }
  150.     sub_ticks_no = s;
  151.     if(sub_ticks_no != 0)
  152.     sub_ticks = new int[sub_ticks_no];
  153.     for(int i = 0; i < sub_ticks_no; i++)
  154.     sub_ticks[i] = 10000 / (sub_ticks_no - 1) * i;
  155.     return ticks_no;
  156.     }
  157.